<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 未排序前的原数组
        var arr = [1,2,3,4,5,6,7,8];

        // // 方法一：sort,缺点：排序概率不等
        // function foo(arr) {
        //     var cloneArr = arr.concat();
        //     cloneArr.sort(function(n1, n2) {
        //         return Math.random() - 0.5;
        //     })
        //     return cloneArr;
        // }
        // for ( var i=0; i<10; i++) {
        //     console.log( foo( arr ) )
        // }
                  
        // 方法二：递归

        // function foo(arr) {
        //     var result = [];
        //     var cloneArr = arr.concat();
        //     // 使用递归，自调用
        //     (function () {
        //         // 使用递归需添加停止条件，避免开辟众多内存
        //         if(!cloneArr.length) {
        //             return
        //         };
        //         var index = Math.floor(Math.random() * cloneArr.length);
        //         result = result.concat(cloneArr.splice(index, 1));
        //         arguments.callee();
        //     })();
        //     return result;
        // }
        // for ( var i=0; i<10; i++) {
        //     console.log( foo( arr ) )
        // }

        // 方法三：迭代,因为使用了splice，减少了数组长度，性能会减低

        // function foo(arr) {
        //     var result = [];
        //     var cloneArr = arr.concat();
        //     var len = cloneArr.length;
        //     // 使用迭代，循环
        //     for (var i=0; i<len; i++){
        //         var index = Math.floor(Math.random() * cloneArr.length);
        //         result = result.concat(cloneArr.splice(index, 1));
        //     };
        //     return result;
        // }
        
        // for ( var i=0; i<10; i++) {
        //     console.log( foo( arr ) )
        // }

        // 方法四：洗牌算法
       
        function foo(arr) {
            var cloneArr = arr.concat();
            var len = cloneArr.length;
            for (var i=0; i<len; i++){
                var index = Math.floor(Math.random() * cloneArr.length);
                
                var temp = cloneArr[index];
                cloneArr[index] = cloneArr[i];
                cloneArr[i] = temp;
            };
            return cloneArr;
        }
        
        for ( var i=0; i<10; i++) {
            console.log( foo( arr ) )
        }

    </script>
</body>
</html>